package vistas;


import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Enumeration;

import javafx.scene.control.RadioButton;

import javax.swing.AbstractButton;
import javax.swing.BoxLayout;
import javax.swing.ButtonGroup;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;


import javax.swing.JTextField;

import vistas.Dibujar;
import vistas.HerramientasGraficas;
import controlador.Coordinador;
import controlador.JuegoPrincipal;
import modelo.Juego;
import modelo.Jugador;
import modelo.mapa.Dimension;
import modelo.mapa.Mapa;

public class MenuPrincipal extends JFrame implements ActionListener {

	private JButton iniciar,cargar,salir,inicio,inicioCargada,volver,nuevoCargada,iniciarNuevoCargada,volverMenuCargar;
	private JTextField nombre,alto,ancho;
	private String nombreJuego,altoJuego,anchoJuego;
	private HerramientasGraficas herramienta=new HerramientasGraficas();
	private Coordinador coordinador=new Coordinador();
	private JuegoPrincipal juegoPrincipal;
	private ButtonGroup partidas;
	private JPanel panelPartidas;
	private JScrollPane scroller;
	private JLabel nombreLabel,altoLabel,anchoLabel;
	
	public void actionPerformed(ActionEvent e){
       if (e.getSource()==volver) {
            reHacerMenuPrincipal();
        }
                if (e.getSource()==salir) {
            System.exit(0);
        }
        if (e.getSource()==iniciar) {
                 verNombre();
         }
                if (e.getSource()==cargar) {
            verPartida();
        }
                if (e.getSource()==inicio) {
                        try{nombreJuego=nombre.getText();
                        	altoJuego=alto.getText();
                        	anchoJuego=ancho.getText();                    
                        	if(altoJuego.isEmpty() || anchoJuego.isEmpty() || nombreJuego.trim().isEmpty() ){
                        		JOptionPane.showMessageDialog(this, "Hay campos vacios");                                
                        	}else{
                        		if(this.noExistePartida(nombreJuego)){
                        			this.iniciarJuego();       
                        		}else{
                        			JOptionPane.showMessageDialog(this, "Jugador ya existente. Ingrese otro.");
                        		}
                        		  
                        	}
                        }catch(NumberFormatException e1){       
                                JOptionPane.showMessageDialog(this,"No Son numeros");                          
                        }
        }

		if(e.getSource()==inicioCargada){
                        try {
                                Juego juego=coordinador.cargar(this.verPartidaAIniciar());
                                coordinador.setJuego(juego);
                                Dibujar dibu=new Dibujar(coordinador);
                                coordinador.setDibujar(dibu);                               
                                juegoPrincipal=new JuegoPrincipal(coordinador);
                                this.reHacerMenuPrincipal();
                                coordinador.setMenuPrincipal(this);
                                this.setVisible(false);
                        } catch (IOException e1) {
                        		JOptionPane.showMessageDialog(this, "La Partida No Existe");
                        }
       }
		if(e.getSource()==nuevoCargada){
			
			verNuevasDimensionesMapa();
		}
		if(e.getSource()==volverMenuCargar){
			verPartida();
		}
		if(e.getSource()==iniciarNuevoCargada){
			try{
				altoJuego=alto.getText();
				anchoJuego=ancho.getText();                    
				if(!altoJuego.isEmpty() && !anchoJuego.isEmpty()){
					this.iniciarJuego();    
				}else{
					JOptionPane.showMessageDialog(this, "Hay campos vacios");        
				}
			}catch(NumberFormatException e1){       
                JOptionPane.showMessageDialog(this,"No Son numeros");                          
			}
		}	
	}
	private void verNuevasDimensionesMapa() {
		nombreJuego=verPartidaAIniciar();
		if(nombreJuego!=null){
			this.borrarTodosLosElementos();
			alto=herramienta.newText("Max: 35 Min:10",620,350,120,20,this);
	        altoLabel=herramienta.newLabel("Alto", 540, 350, 80, 20, this);
	        ancho=herramienta.newText("Max: 20 Min:8",620,380,120,20,this);
	        anchoLabel=herramienta.newLabel("Ancho", 540, 380, 80, 20,this);
	        iniciarNuevoCargada=herramienta.newButton("Iniciar",540,420,200,40,this);
	        volverMenuCargar=herramienta.newButton("Volver",540,470,200,40,this);
		}else{
			JOptionPane.showMessageDialog(this, "No hay nada Seleccionado");
		}
		
				
	}
	private void iniciarJuego() {
		int altoMapa=Integer.parseInt(altoJuego);
        int anchoMapa=Integer.parseInt(anchoJuego);
        if(altoMapa<36 && anchoMapa<21 && altoMapa>9 && anchoMapa>7){
        	Mapa.borrarMapa();
       		Mapa mapa = Mapa.getInstance(new Dimension(altoMapa,anchoMapa));
               Jugador jugador = new Jugador(nombreJuego);
               Juego juego = Juego.iniciarJuego(jugador);
               coordinador.setJuego(juego);
               Dibujar dibu = new Dibujar(coordinador);
               coordinador.setDibujar(dibu);
               juegoPrincipal=new JuegoPrincipal(coordinador);
               this.reHacerMenuPrincipal();
               coordinador.setMenuPrincipal(this);
               this.setVisible(false);
        }else{
       	 JOptionPane.showMessageDialog(this, "Las dimensiones del mapa no son correctas");
        }		
	}
	private boolean noExistePartida(String nombreJugador){
		try {
			String [] cadena=coordinador.getPartidas().split("\n");
			for(int i=0;i<cadena.length;i++){
				if(cadena[i].equals(nombreJugador)){
					return false;
				}
			}
		} catch (IOException e) {
			JOptionPane.showMessageDialog(this, "Error en la lectura de archivo de partidas");
			return true;
		}
		return true;
	}
	
		
	
	
	private String verPartidaAIniciar() {
		Enumeration<AbstractButton> part=partidas.getElements();
		ArrayList<AbstractButton> listaPartidas = Collections.list(part);//lo convierto a una lista
		for(AbstractButton boton:listaPartidas){
			if(boton.isSelected()){
				String texto=boton.getText();
				return texto.trim();
			}
			
		}
		return null;
	}

	private void reHacerMenuPrincipal() {
		this.borrarTodosLosElementos();
		iniciar=herramienta.newButton("Iniciar Juego",540,300,200,40,this);
		cargar=herramienta.newButton("Cargar Partida",540,350,200,40,this);
		salir=herramienta.newButton("Salir",540,400,200,40,this);
		this.repaint();		
	}
        
        
  

	private void borrarTodosLosElementos() {
		herramienta.remover(scroller,this);
		herramienta.remover(iniciar, this);
		herramienta.remover(cargar, this);
		herramienta.remover(salir, this);
		herramienta.remover(inicio, this);
		herramienta.remover(inicioCargada, this);
		herramienta.remover(volver, this);
		herramienta.remover(alto,this);
		herramienta.remover(ancho,this);
		herramienta.remover(nombre,this);
		herramienta.remover(altoLabel, this);
		herramienta.remover(anchoLabel, this);
		herramienta.remover(nombreLabel, this);
		herramienta.remover(nuevoCargada, this);
		herramienta.remover(iniciar, this);
		herramienta.remover(cargar, this);
		herramienta.remover(salir, this);	
		herramienta.remover(iniciarNuevoCargada, this);
		herramienta.remover(volverMenuCargar, this);
	}
	private void verPartida() {
		this.borrarTodosLosElementos();
		try{
			if(coordinador.getPartidas()!=null){
				this.ponerMenuPartidas();				
			}else{
				JOptionPane.showMessageDialog(this,"No hay Partidas");
				this.reHacerMenuPrincipal();
			}
		}catch(IOException e1){
			JOptionPane.showMessageDialog(this,"No hay Partidas");
			this.reHacerMenuPrincipal();
		}
			
	}

        private void ponerMenuPartidas() throws IOException {
        	panelPartidas=new JPanel();
			panelPartidas.setLayout(new BoxLayout(panelPartidas,BoxLayout.Y_AXIS));//lo pone en vertical
			panelPartidas.setBounds(0, 0, 100, 400);
			panelPartidas.setOpaque(false);
			partidas=herramienta.newButtonGroup(coordinador.getPartidas(),0,0,0,0,panelPartidas);				
			scroller = new JScrollPane(panelPartidas);
			scroller.setBounds(540, 200, 200, 140);
			scroller.setOpaque(false);				
			scroller.getViewport().setOpaque(false);
			scroller.setHorizontalScrollBarPolicy(javax.swing.ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
			scroller.setVerticalScrollBarPolicy(javax.swing.ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
			this.add(scroller);
			panelPartidas.setVisible(true);				
			inicioCargada=herramienta.newButton("Cargar Partida",540,360,200,40,this);
			nuevoCargada=herramienta.newButton("Comenzar nuevo juego",540,410,200,40,this);
			volver=herramienta.newButton("Volver",540,460,200,40,this);
			this.repaint();	
		
	}
		private void verNombre() {
               this.borrarTodosLosElementos();
                nombre=herramienta.newText("",620,320,120,20,this);
                nombreLabel=herramienta.newLabel("Nombre",540 ,320, 80, 20, this);
                alto=herramienta.newText("Max: 35 Min:10",620,350,120,20,this);
                altoLabel=herramienta.newLabel("Alto", 540, 350, 80, 20, this);
                ancho=herramienta.newText("Max: 20 Min:8",620,380,120,20,this);
                anchoLabel=herramienta.newLabel("Ancho", 540, 380, 80, 20,this);
                inicio=herramienta.newButton("Iniciar",540,420,200,40,this);    
                volver=herramienta.newButton("Volver",540,480,200,40,this);
                this.repaint();         
        }
        public void menuPrincipal(){
                this.setLayout(null);
                this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                this.setTitle("AlgoCity");
                this.setBounds(128, 72, 1280, 720);
                JPanelConFondo fondo=new JPanelConFondo(Vista.getImagenFondo());
                fondo.setLayout(null);
                this.setContentPane(fondo);
                fondo.setBounds(0,0,1280,720);
                fondo.setVisible(true);
                this.setVisible(true);
                this.setResizable(false);
                this.repaint();
                iniciar=herramienta.newButton("Iniciar Juego",540,300,200,40,this);
                cargar=herramienta.newButton("Cargar Partida",540,350,200,40,this);
                salir=herramienta.newButton("Salir",540,400,200,40,this);
                this.repaint();
                
        }

        

}
